package com.leon.proxy.V03;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;

/**
 * 动态代理-优点：不需要我们手动写代理类，更加灵活
 * 1.写完基础功能
 * 2.添加辅助功能
 * 3.使用reflect反射包中的proxy.newInstance创建代理对象，再通过代理对象调用

 * @author 史鸿禹
 * @date 2022/07/13  2:54 下午
 */
public class Person implements Action,Behavor{


    @Override
    public void eat() {
        System.out.println("吃饭");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void sleep() {
        System.out.println("睡觉");
    }


    public static void main(String[] args) {
        //将jdk动态代理生成的文件保存到本地 -开启
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        //                                          被代理类的类加载                被代理类实现的接口的字节码文件集合      调用处理器-调用被代理的方法
        Action a = (Action) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Action.class,Behavor.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.err.println(method.getName()+"开始");
                Object invoke = method.invoke(new Person(), args);
                System.err.println(method.getName()+"结束");
                return invoke;
            }
        });
        a.eat();

    }

}


interface Action{
    public void eat();
}
interface Behavor{
    public void sleep();
}
